package cn.sc.summer.mybatis.util;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.sc.summer.constant.model.PageParam;
import cn.sc.summer.constant.model.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 类名：分页数据信息转换类
 *
 * @author a-xin
 * @date 2024/6/21 09:41
 */
@Slf4j
@Component
public class PageUtil {

    /**
     * 构建分页查询参数
     *
     * @param param 分页参数
     * @param clazz 分页类型
     * @param <T>   分页对象类型
     * @param <P>   参数类型
     * @return 分页对象
     */
    public static <T, P extends PageParam> Page<T> createPage(P param, @NonNull Class<T> clazz) {
        String name = clazz.getName();
        log.debug("==> The page type: {}", name);
        Page<T> tPage = new Page<>();
        tPage.setCurrent(param.getCurrent() == 0L ? 1L : param.getCurrent());
        tPage.setSize(param.getSize());
        return tPage;
    }

    /**
     * 分页数据转换返回数据
     *
     * @param page 分页查询数据
     * @param <T>  返回数据类型
     * @return 统一返回分页信息
     */
    public static <T> PageResult<T> pageToResult(Page<T> page) {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setCurrent(page.getCurrent());
        pageResult.setSize(page.getSize());
        pageResult.setTotal(page.getTotal());
        pageResult.setRecords(page.getRecords());
        return pageResult;
    }

    /**
     * 分页数据转换返回数据
     *
     * @param page  分页查询数据
     * @param clazz 返回类型class
     * @param <T>   查询数据类型
     * @param <F>   返回数据类型
     * @return 统一返回分页信息
     */
    public static <T, F> PageResult<F> pageToResult(Page<T> page, Class<F> clazz) {
        PageResult<F> pageResult = new PageResult<>();
        pageResult.setCurrent(page.getCurrent());
        pageResult.setSize(page.getSize());
        pageResult.setTotal(page.getTotal());
        if (page.getRecords().size() > 0) {
            pageResult.setRecords(page.getRecords().stream().map(item -> BeanUtil.toBean(item, clazz)).collect(Collectors.toList()));
        }
        return pageResult;
    }

    /**
     * page转换
     *
     * @param page   分页查询数据
     * @param mapper 类型转换
     * @param <T>    原始数据类型
     * @param <R>    返回数据类型
     * @return 返回数据类型
     */
    public static <T, R> PageResult<R> pageToResult(Page<T> page, Function<? super T, ? extends R> mapper) {
        PageResult<R> pageResult = new PageResult<>();
        pageResult.setCurrent(page.getCurrent());
        pageResult.setSize(page.getSize());
        pageResult.setTotal(page.getTotal());
        if (page.getRecords().size() > 0) {
            pageResult.setRecords(page.getRecords().stream().map(mapper).collect(Collectors.toList()));
        }
        return pageResult;
    }

    /**
     * 分页数据转换返回数据
     *
     * @param page   分页查询数据
     * @param action 返回结果处理方式
     * @param <T>    返回数据类型
     * @return 统一返回分页信息
     */
    public static <T> PageResult<T> pageToResult(Page<T> page, Consumer<? super T> action) {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setCurrent(page.getCurrent());
        pageResult.setSize(page.getSize());
        pageResult.setTotal(page.getTotal());
        if (page.getRecords().size() > 0) {
            pageResult.setRecords(page.getRecords().stream().peek(action).collect(Collectors.toList()));
        }
        return pageResult;
    }

}
